package controleur;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import modele.Article;
import modele.Commentaire;
import modele.Competition;
import modele.Config;
import modele.FacadeArticle;
import modele.FacadeMembre;
import modele.FacadeMenu;
import modele.FacadeSite;
import modele.InfoSession;
import modele.Membre;
import modele.ValidationForm;

/**
 * Servlet implementation class Article
 */
public class Consultation extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	@EJB private FacadeMenu fmenu;
	@EJB private FacadeSite fs;
	@EJB FacadeMembre fmembre;
	@EJB private FacadeArticle fa;

	public Consultation() {
		super();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

		// Session utilisateur
		HttpSession session = request.getSession(true);
		InfoSession infoSession = (InfoSession) session.getAttribute("infoSession");

		String page = request.getParameter("page");
		String pageInclue = "accueil.jsp";

		HashMap<String, List<Competition>> menu = fmenu.getMenu();

		// utilisateur non connecte?
		boolean connecte = infoSession != null && infoSession.getConnecte();

		if (page == null || page.equals("") || page.equals("accueil")) {
			pageInclue = "accueil.jsp";
		}
		// Consultation de mes articles
		else if (page.equals("mesArticles") && connecte) {

			int numeroPage = Integer.parseInt(request.getParameter("numeroPage"));
			// parametre qui definit le tri (date, nbCommentaires ou meilleure note)
			String tri = request.getParameter("tri");
			int offset = (numeroPage - 1) * Config.nbArticlesParPage;
			Long idAuteur = infoSession.getMembre().getId();

			int nbArticles = fs.getNombreResultatsRechercheArticles(null, null,idAuteur, null, null, null, null);
			ArrayList<Article> articles = (ArrayList<Article>) fs.rechercherArticles(offset, Config.nbArticlesParPage,
					tri,false, null, null, idAuteur, null, null, null, null);

			// Creation des resumés associés à mes articles
			ArrayList<String> resumesArticles = new ArrayList<String>();
			for (Article art : articles) {
				
				String resume = this.fa.getResume(art);
				resumesArticles.add(resume);
			}

			request.setAttribute("resumesArticles", resumesArticles);
			request.setAttribute("tri", tri);
			request.setAttribute("listeArticles", articles);
			// nbPages determine le nombre de pages utiles pour la pagination
			request.setAttribute("nbPages", (int) Math.ceil((double) nbArticles/Config.nbArticlesParPage));

			pageInclue = "mesArticles.jsp";
		}
		// Consultation des articles en général
		else if (page.equals("articles")) {

			String numeroPage = request.getParameter("numeroPage");
			String tri = request.getParameter("tri");
			String sport = request.getParameter("sport");
			String competition = request.getParameter("compet");

			try {

				int numPage = Integer.parseInt(numeroPage);
				// l'offset determine l'indice de l'article qui s'affiche 
				// au debut de chaque page de la pagination
				int offset = (numPage - 1) * Config.nbArticlesParPage;

				if (sport != null && !sport.equals("")) {

					int nbArticles = 0;
					ArrayList<Article> articles = new ArrayList<Article>();
					ArrayList<String> resumesArticles = new ArrayList<String>();

					if (competition != null && !competition.equals("")) {

						long idCompetition = Long.parseLong(competition);

						nbArticles = fs.getNombreResultatsRechercheArticles(null, idCompetition, null, null, null, null,null);
						articles = (ArrayList<Article>) fs.rechercherArticles(offset, Config.nbArticlesParPage, tri, false,
								null, idCompetition, null, null, null, null,null);
					}
					else {

						long idSport = Long.parseLong(sport);

						nbArticles = fs.getNombreResultatsRechercheArticles(idSport, null, null, null, null, null, null);
						articles = (ArrayList<Article>) fs.rechercherArticles(offset, Config.nbArticlesParPage, tri, false,
								idSport, null, null, null, null, null, null);
					}

					// Creation du resumé de chaque articles (accueil, menu foot,rugby,etc)
					for (Article article : articles) {
						String resume = this.fa.getResume(article);
						resumesArticles.add(resume);
					}
					
					// On teste le cas où l'on vient de rechercheToutesCompetitions.jsp
					if(sport.equals("0")){
						competition = String.valueOf(fa.getCompetition(Long.parseLong(competition)).getId());
						
						
						if (competition.equals("0")){//On teste si la valeur en paramètre est correcte, si non, on envoie un message d'erreur
							String erreur = ValidationForm.ErreurSelectionRequis = "<p>Vous devez sélectionner le champ <strong>%Compétition</strong></p>";
							request.setAttribute("erreur", erreur);
							ArrayList<Competition> liste = (ArrayList<Competition>) fmenu.getListCompetition();
							request.setAttribute("competitions", liste);
							pageInclue = "rechercheToutesCompetitions.jsp";							
						}
						
						else{//Si la valeur est correcte on effectue la recherche d'articles
							sport= String.valueOf(fa.getCompetition(Long.parseLong(competition)).getSport().getId());
							
							// Permet à la jsp de connaitre sur quel page sport est le client
							// et ainsi charger la bonne couleur dans le cartouche situé
							//en dessous du menu
							String couleurSport = fmenu.getNameSport(Long.parseLong(sport));
							request.setAttribute("couleurSport",couleurSport);
							
							request.setAttribute("listeArticles", articles);
							request.setAttribute("resumesArticles", resumesArticles);

							request.setAttribute("tri", tri);
							request.setAttribute("nbPages", (int) Math.ceil((double) nbArticles
											/ Config.nbArticlesParPage));
							request.setAttribute("compet", competition);
							request.setAttribute("sport", sport);
							pageInclue = "articles.jsp";
						
						}											
					}
					
					else{// Cas normal, on effectue la recherche d'articles

					String couleurSport = fmenu.getNameSport(Long.parseLong(sport));
					request.setAttribute("couleurSport",couleurSport);
					request.setAttribute("listeArticles", articles);
					request.setAttribute("resumesArticles", resumesArticles);

					request.setAttribute("tri", tri);
					request.setAttribute("nbPages", (int) Math.ceil((double) nbArticles/Config.nbArticlesParPage));
					request.setAttribute("compet", competition);
					request.setAttribute("sport", sport);
					pageInclue = "articles.jsp";
					}

				}
				// Pas de sport en parametre qui est necessaire à la consultation
				// donc redirection vers l'accueil
				else {
					pageInclue = "accueil.jsp";
				}

			} catch (NumberFormatException e) {
				e.printStackTrace();
				pageInclue = "accueil.jsp";
			}

		}
		else if (page.equals("rechercheCompetition")) {
			ArrayList<Competition> liste = (ArrayList<Competition>) fmenu
					.getListCompetition();
			request.setAttribute("competitions", liste);
			pageInclue = "rechercheToutesCompetitions.jsp";
		}
		// Consultation d'un article
		else if (page.equals("article")) {

			Long idArticle = Long.parseLong(request.getParameter("idArticle"));
			Article art = fs.getArticle(idArticle);

			request.setAttribute("nbPages", (int) Math.ceil((double) (art.getCommentaires().size())/Config.nbCommentairesParPage));
			request.setAttribute("article", art);
			pageInclue = "article.jsp";

		}
		// Consultation des infos d'un membre et de ses articles
		else if (page.equals("infosMembre")) {
			
			String idMembre = request.getParameter("idMembre");
			String num = request.getParameter("numeroPage");
			String tri = request.getParameter("tri");
			
			if (idMembre != null && !idMembre.equals("")) {
				
				try{					
					long id = Long.parseLong(idMembre);
					Membre m = fmembre.majMembre(id);
					int numeroPage;
					
					if (m != null) {	
						if (num == null || num.equals("")) {
							numeroPage = 1;
						} else {
							numeroPage = Integer.parseInt(num);
						}
						if (tri == null || tri.equals("")) {
							tri = "date";
						}
	
						int offset = (numeroPage - 1) * Config.nbArticlesParPage;
						Long idAuteur = Long.parseLong(idMembre);
	
						int nbArticles = fs.getNombreResultatsRechercheArticles(
								null, null, idAuteur, null, null, null, null);
						ArrayList<Article> articles = (ArrayList<Article>) fs.rechercherArticles(offset,
									Config.nbArticlesParPage, tri, false, null,
										null, idAuteur, null, null, null, null);
	
						ArrayList<String> resumesArticles = new ArrayList<String>();
	
						for (Article art : articles) {							
							String resume = this.fa.getResume(art);	
							resumesArticles.add(resume);
						}
	
						request.setAttribute("resumesArticles", resumesArticles);
						request.setAttribute("tri", tri);
						request.setAttribute("listeArticles", articles);
						request.setAttribute("nbPages", (int) Math.ceil((double) nbArticles/Config.nbArticlesParPage));
	
						request.setAttribute("membre", m);
						pageInclue = "infosMembre.jsp";
					} else {
						request.setAttribute("texteErr",
								"la consultation de ce membre");
						pageInclue = "erreur.jsp";
					}
					
				}
				catch(NumberFormatException e){
					e.printStackTrace();
					pageInclue = "accueil.jsp";
				}
			} else {
				pageInclue = "accueil.jsp";
			}
			

		}
		// Affichage de tous les commentaires lors de la consultation d'un article
		else if (page.equals("tousLesCommentaires")) {
			Long idArticle = Long.parseLong(request.getParameter("idArticle"));
			Article art = fs.getArticle(idArticle);
			List<Commentaire> listeComs = fa.getCommentairesTriesDate(idArticle);

			request.setAttribute("nbPages", (int) Math.ceil((double) (art.getCommentaires().size())
					/ Config.nbCommentairesParPage));
			request.setAttribute("sport", art.getSport().getName());
			request.setAttribute("titre", art.getTitre());
			request.setAttribute("idArt", art.getId());
			request.setAttribute("listeComs", listeComs);
			pageInclue = "commentaires.jsp";
		}

		if (pageInclue.equals("accueil.jsp")) {

			request.getRequestDispatcher("Site?page=accueil").forward(request,response);

		} else {
			request.setAttribute("idsSports", fs.getIdsSports());
			request.setAttribute("formatDate", Config.sdf);
			request.setAttribute("infoSession", infoSession);
			request.setAttribute("Menu", menu);
			request.setAttribute("pageInclue", pageInclue);
			request.getRequestDispatcher("index.jsp").forward(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}